// 基于axios封装网络请求
// 引入包
import { getNewToken } from '@/api'
import router from '@/router'
import axios from 'axios'
import { getToken, setToken } from './token'
// 创建对象
const request = axios.create({
  baseURL: 'http://geek.itheima.net/',
  timeout: 20000
})
// 设置请求拦截头，和返回拦截头
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 加入请求头 ?.可选链
  if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  console.log(config)
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  // 对401错误进行一个判断，401表示token过期了
  if (error.response.status === 401) {
    // router.push({ path: '/login' })
    // 进行一个无感知的刷新
    const res = await getNewToken()
    if (res) {
      setToken(res.data.data.token)
    }
    // 被拦截下来的重新进行请求
    // 修改请求头的token
    error.config.headers.Authorization = `Bearer ${res.data.data.token}`
    return axios(error.config)
  // eslint-disable-next-line brace-style
  }
  // 刷新的token也过期了
  else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'PUT') {
  // 强制退出
    localStorage.clear()
    router.replace('/login')
  }
  return Promise.reject(error)
})
export default request
